package com.junlong0716.enjoylearning.utils;

import android.os.Build;


import com.junlong0716.enjoylearning.entity.SortModel;
import com.junlong0716.enjoylearning.entity.SortToken;
import com.junlong0716.enjoylearning.parser.CharacterParser;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author: 巴黎没有摩天轮Li
 * @description:
 * @date: Created in 下午10:34 2018/7/18
 * @modified by:
 */
public class ConvertUtils {


    /** 中文字符串匹配 */
    public static String chReg = "[\\u4E00-\\u9FA5]+";


    /**
     * 取sort_key的首字母
     * @param sortKey
     * @return
     */
    public static String getSortLetterBySortKey(String sortKey,CharacterParser characterParser) {
        if (sortKey == null || "".equals(sortKey.trim())) {
            return null;
        }
        String letter = "#";
        //汉字转换成拼音
        String sortString = sortKey.trim().substring(0, 1).toUpperCase(Locale.CHINESE);
        // 正则表达式，判断首字母是否是英文字母
        if (sortString.matches("[A-Z]")) {
            letter = sortString.toUpperCase(Locale.CHINESE);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {// 5.0以上需要判断汉字
            if (sortString.matches("^[\u4E00-\u9FFF]+$"))// 正则表达式，判断是否为汉字
                letter = getSortLetter(sortString.toUpperCase(Locale.CHINESE),characterParser);
        }
        return letter;
    }

    /**
     * 名字转拼音,取首字母
     * @param name
     * @return
     */
    public static String getSortLetter(String name,CharacterParser characterParser) {
        String letter = "#";
        if (name == null) {
            return letter;
        }
        //汉字转换成拼音
        String pinyin = characterParser.getSelling(name);
        String sortString = pinyin.substring(0, 1).toUpperCase(Locale.CHINESE);

        // 正则表达式，判断首字母是否是英文字母
        if (sortString.matches("[A-Z]")) {
            letter = sortString.toUpperCase(Locale.CHINESE);
        }
        return letter;
    }



    //String chReg="[^\\u4E00-\\u9FA5]";//除中文外的字符匹配
    /**
     * 解析sort_key,封装简拼,全拼
     * @param sortKey
     * @return
     */
    public SortToken parseSortKey(String sortKey) {
        SortToken token = new SortToken();
        if (sortKey != null && sortKey.length() > 0) {
            //其中包含的中文字符
            String[] enStrs = sortKey.replace(" ", "").split(chReg);
            for (int i = 0, length = enStrs.length; i < length; i++) {
                if (enStrs[i].length() > 0) {
                    //拼接简拼
                    token.setSimpleSpell(token.getSimpleSpell() + enStrs[i].charAt(0));
                    token.setWholeSpell(token.getWholeSpell() + enStrs[i]);
                }
            }
        }
        return token;
    }


    /**
     * 解析sort_key,封装简拼,全拼。
     * Android 5.0 以上使用
     * @param sortKey
     * @return
     */
    public static SortToken parseSortKeyLollipop(String sortKey,CharacterParser characterParser) {
        String regEx = "[/s`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]";

        SortToken token = new SortToken();
        if (sortKey != null && sortKey.length() > 0) {
            // 清除掉所有特殊符号
            Matcher matches = Pattern.compile(regEx).matcher(sortKey);
            String result = matches.replaceAll("").trim();
            String replace = result.replace(" ", "");// 删除空格

            boolean isChinese = replace.matches(chReg);
            // 分割条件：中文不分割，英文以大写和空格分割
            String regularExpression = isChinese ? "" : "(?=[A-Z])|\\s";

            String[] enStrs = sortKey.split(regularExpression);

            for (int i = 0, length = enStrs.length; i < length; i++)
                if (enStrs[i].length() > 0) {
                    //拼接简拼
                    token.setSimpleSpell(token.getSimpleSpell() + getSortLetter(String.valueOf(enStrs[i].charAt(0)),characterParser));
                    token.setWholeSpell(token.getWholeSpell() + characterParser.getSelling(enStrs[i]));
                }
        }
        return token;
    }


    /**
     * 模糊查询
     * @param str
     * @return
     */
    public static List<SortModel> search(String str,List<SortModel> mAllContactsList) {
        List<SortModel> filterList = new ArrayList<SortModel>();// 过滤后的list
        //if (str.matches("^([0-9]|[/+])*$")) {// 正则表达式 匹配号码
        if (str.matches("^([0-9]|[/+]).*")) {// 正则表达式 匹配以数字或者加号开头的字符串(包括了带空格及-分割的号码)
            String simpleStr = str.replaceAll("\\-|\\s", "");
            for (SortModel contact : mAllContactsList) {
                if (contact.getNumber() != null && contact.getName() != null) {
                    if (contact.getSimpleNumber().contains(simpleStr) || contact.getName().contains(str)) {
                        if (!filterList.contains(contact)) {
                            contact.setSearch(true);
                            filterList.add(contact);
                        }
                    }
                }
            }
        } else {
            for (SortModel contact : mAllContactsList) {
                if (/*contact.number != null &&*/ contact.getName() != null) {
                    //姓名全匹配,姓名首字母简拼匹配,姓名全字母匹配
                    boolean isNameContains = contact.getName().toLowerCase(Locale.CHINESE)
                            .contains(str.toLowerCase(Locale.CHINESE));

                    boolean isSortKeyContains = contact.getSortKey().toLowerCase(Locale.CHINESE).replace(" ", "")
                            .contains(str.toLowerCase(Locale.CHINESE));

                    boolean isSimpleSpellContains = contact.getSortToken().getSimpleSpell().toLowerCase(Locale.CHINESE)
                            .contains(str.toLowerCase(Locale.CHINESE));

                    boolean isWholeSpellContains = contact.getSortToken().getWholeSpell().toLowerCase(Locale.CHINESE)
                            .contains(str.toLowerCase(Locale.CHINESE));

                    if (isNameContains || isSortKeyContains || isSimpleSpellContains || isWholeSpellContains) {
                        if (!filterList.contains(contact)) {
                            contact.setSearch(true);
                            filterList.add(contact);
                        }
                    }
                }
            }
        }
        return filterList;
    }
}
